package com.mytools.common.redisUtils;

import org.redisson.api.RBatch;
import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * 使用前需配置application的redis的yaml与redisson.yml
 * @author LJK
 * @description
 * @date 2024/12/23
 */
@Component
public class BloomFilterUtil {
    @Autowired
    private RedissonClient redissonClient;

    /**
     * 创建布隆过滤器
     * @param filterName 过滤器名称
     * @param expectedInsertions 期望插入的元素数量
     * @param falseProbability 误判率
     */
    public <T> RBloomFilter<T> create(String filterName,long expectedInsertions, double falseProbability) {
        RBloomFilter<T> filter= redissonClient.getBloomFilter(filterName);
        filter.tryInit(expectedInsertions, falseProbability);
        return filter;
    }

    public static void main(String[] args) {
        //布隆过滤器使用样例
        BloomFilterUtil bloomFilterUtil = new BloomFilterUtil();

        RBloomFilter<Long> myBloomFilter = bloomFilterUtil.
                create("myBloomFilter", 1000000, 0.01);

    }
    //布隆过滤器预热，预热有两种情况是可以进行的：1.redis刚刚启动需要预热，2.在流量低峰（例如半夜）执行定时任务重新预热数据
    public static void init(RBloomFilter<Long> myBloomFilter){
        for (int i = 0; i < 1000000; i++) {
            myBloomFilter.add((long) i);
        }
    }


    //根据id查询用户，先通过过滤器查看，再走其他途径（->redis->mysql）
    public static Long findById(Long id, RBloomFilter<Long> myBloomFilter){
        if(!myBloomFilter.contains(id)){
            //非法id，使用redisTemplate缓存一个短期的空数据
            return null;
        }
        //不是非法访问，先走redis，redis没有再去MySQL里查
        return 1l;
    }
    //根据id删除用户，过滤器不改变

    //根据id更新用户，过滤器新增
    public static Long addOrUpdate(Long id, RBloomFilter<Long> myBloomFilter){
        myBloomFilter.add(id);
        return id;
    }
}
